/**
 * ControladoraBDDocente.java
 */

/**
 *  AdSec: Administrador de Secundarias
 *  Copyright (C) 2009 Daniela Ramírez Chaves (dannyrch@gmail.com)
 *  Copyright (C) 2009 Leonel Salazar Valverde (leo87sv@gmail.com)
 *
 *  This file is part of AdSec.
 *  AdSec is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  AdSec is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with AdSec.  If not, see <http://www.gnu.org/licenses/>.
 */

package adsec.datos;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.ResultSet;
import java.util.LinkedList;
import adsec.entidades.Comite;
import adsec.entidades.Docente;


public class ControladoraBDDocente {

    private Connection conexion;
    private AdministradorConexion adminConexion;
    
    public ControladoraBDDocente(){
        adminConexion = AdministradorConexion.getInstancia();
    }

    public Docente consultarDocente(String cedula){
        Docente docente = null;
        conexion = adminConexion.getConexion();
        if(conexion != null){
            CallableStatement procedimiento = this.spConsultarDocente(conexion, cedula);
            if(procedimiento != null){
                try{
                    procedimiento.execute();
                    ResultSet resultado = procedimiento.getResultSet();
                    if(resultado.next()){
                        docente = this.crearDocente(resultado);
                    }
                }catch(SQLException e){
                    e.printStackTrace();
                }//fin de try catch
            }//fin de if
        }//fin de if
        adminConexion.cerrarConexion();
        return docente;
    }//fin de consultarEstudiante

    public LinkedList<Docente> consultarDocentes(){
        LinkedList<Docente> lista = new LinkedList<Docente>();
        conexion = adminConexion.getConexion();
        if(conexion != null){
            CallableStatement procedimiento = this.spConsultarDocentes(conexion);
            if(procedimiento != null){
                try{
                    procedimiento.execute();
                    ResultSet resultado = procedimiento.getResultSet();
                    while(resultado.next()){
                        Docente docente = this.crearDocenteGrid(resultado);
                        lista.add(docente);
                    }//fin de while
                }catch(SQLException e){
                    e.printStackTrace();
                }//fin de try catch
            }//fin de if
        }//fin de if
        adminConexion.cerrarConexion();
        return lista;
    }//fin de consultarDocentes

    public LinkedList<Docente> consultarDocentesComite(int idComite){
        LinkedList<Docente> lista = new LinkedList<Docente>();
        conexion = adminConexion.getConexion();
        if(conexion != null){
            CallableStatement procedimiento = this.spConsultarDocentesComite(conexion, idComite);
            if(procedimiento != null){
                try{
                    procedimiento.execute();
                    ResultSet resultado = procedimiento.getResultSet();
                    while(resultado.next()){
                        Docente docente = this.crearDocenteComite(resultado);
                        lista.add(docente);
                    }//fin de while
                }catch(SQLException e){
                    e.printStackTrace();
                }//fin de try catch
            }//fin de if
        }//fin de if
        adminConexion.cerrarConexion();
        return lista;
    }//fin de consultarDocentesComite

        public LinkedList<Docente> consultarDocentesNoComite(int idComite){
        LinkedList<Docente> lista = new LinkedList<Docente>();
        conexion = adminConexion.getConexion();
        if(conexion != null){
            CallableStatement procedimiento = this.spConsultarDocentesNoComite(conexion, idComite);
            if(procedimiento != null){
                try{
                    procedimiento.execute();
                    ResultSet resultado = procedimiento.getResultSet();
                    while(resultado.next()){
                        Docente docente = this.crearDocenteComite(resultado);
                        lista.add(docente);
                    }//fin de while
                }catch(SQLException e){
                    e.printStackTrace();
                }//fin de try catch
            }//fin de if
        }//fin de if
        adminConexion.cerrarConexion();
        return lista;
    }//fin de consultarDocentesNoComite

    public int insertarDocente(Docente docente){
        int resultado = AdministradorConexion.QUERY_ERROR;
        conexion = adminConexion.getConexion();
        if(conexion != null){
            CallableStatement procedimiento = this.spInsertarDocente(conexion, docente);
            if(procedimiento != null){
                try{
                    procedimiento.execute();
                    resultado = AdministradorConexion.QUERY_OK;
                }catch(SQLException e){
                    e.printStackTrace();
                }//fin de try catch
            }//fin de if
        }//fin de if
        adminConexion.cerrarConexion();
        return resultado;
    }//fin de insertarDocente

    public int modificarDocente(Docente docente){
        int resultado = AdministradorConexion.QUERY_ERROR;
        conexion = adminConexion.getConexion();
        if(conexion != null){
            CallableStatement procedimiento = this.spModificarDocente(conexion, docente);
            if(procedimiento != null){
                try{
                    procedimiento.execute();
                    resultado = AdministradorConexion.QUERY_OK;
                }catch(SQLException e){
                    e.printStackTrace();
                }//fin de try catch
            }//fin de if
        }//fin de if
        adminConexion.cerrarConexion();
        return resultado;
    }//fin de modificarDocente

    public int eliminarDocente(String cedula){
        int resultado = AdministradorConexion.QUERY_ERROR;
        conexion = adminConexion.getConexion();
        if(conexion != null){
            CallableStatement procedimiento = this.spEliminarDocente(conexion, cedula);
            if(procedimiento != null){
                try{
                    procedimiento.execute();
                    resultado = AdministradorConexion.QUERY_OK;
                }catch(SQLException e){
                    e.printStackTrace();
                }//fin de try catch
            }//fin de if
        }//fin de if
        adminConexion.cerrarConexion();
        return resultado;
    }//fin de eliminarDocente

    private CallableStatement spConsultarDocente(Connection conexion, String cedula){
        CallableStatement procedimiento = null;
        try{
            procedimiento = conexion.prepareCall("CALL consultarDocente" + UtilidadesCapaDatos.agregarParametros(1),
                ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            procedimiento.setString(Docente.cedulaNC+"_p", cedula);
        }catch(SQLException sqlException){
            sqlException.printStackTrace();
        }
        return procedimiento;
    }//fin de spConsultarDocente
    
    private CallableStatement spConsultarDocentes(Connection conexion){
        CallableStatement procedimiento = null;
        try{
            procedimiento = conexion.prepareCall("CALL consultarDocentes()",
                ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
        }catch(SQLException sqlException){
            sqlException.printStackTrace();
        }
        return procedimiento;
    }//fin de spConsultarDocentes

    private CallableStatement spConsultarDocentesComite(Connection conexion, int idComite){
        CallableStatement procedimiento = null;
        try{
            procedimiento = conexion.prepareCall("CALL consultarDocentesComite" + UtilidadesCapaDatos.agregarParametros(1) ,
                ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            procedimiento.setInt(Comite.idComiteNC + "_p", idComite);
        }catch(SQLException sqlException){
            sqlException.printStackTrace();
        }
        return procedimiento;
    }//fin de spConsultarDocentesComite

    private CallableStatement spConsultarDocentesNoComite(Connection conexion, int idComite){
        CallableStatement procedimiento = null;
        try{
            procedimiento = conexion.prepareCall("CALL consultarDocentesNoComite" + UtilidadesCapaDatos.agregarParametros(1),
                ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            procedimiento.setInt(Comite.idComiteNC + "_p", idComite);
        }catch(SQLException sqlException){
            sqlException.printStackTrace();
        }
        return procedimiento;
    }//fin de spConsultarDocentesComite
    
    private CallableStatement spInsertarDocente(Connection conexion, Docente docente){
        CallableStatement procedimiento = null;
        try{
            procedimiento = conexion.prepareCall("CALL insertarDocente" + UtilidadesCapaDatos.agregarParametros(15),
                ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            procedimiento.setString(Docente.cedulaNC+"_p", docente.getCedula());
            procedimiento.setString(Docente.nombreNC+"_p", docente.getNombre());
            procedimiento.setString(Docente.apellidosNC+"_p", docente.getApellidos());
            procedimiento.setDate(Docente.fechaNacNC+"_p", docente.getFechaNac());
            procedimiento.setString(Docente.telefono1NC+"_p", docente.getTelefono1());
            procedimiento.setString(Docente.telefono2NC+"_p", docente.getTelefono2());
            procedimiento.setString(Docente.sexoNC+"_p", docente.getSexo());
            procedimiento.setString(Docente.nacionalidadNC+"_p", docente.getNacionalidad());
            procedimiento.setString(Docente.provinciaNC+"_p", docente.getProvincia());
            procedimiento.setString(Docente.cantonNC+"_p", docente.getCanton());
            procedimiento.setString(Docente.distritoNC+"_p", docente.getDistrito());
            procedimiento.setString(Docente.otrasSeniasNC+"_p", docente.getOtrasSenias());
            procedimiento.setString(Docente.puestoNC+"_p", docente.getPuesto());
            procedimiento.setString(Docente.categoriaNC+"_p", docente.getCategoria());
            procedimiento.setInt(Docente.leccionesAsignadasNC+"_p", docente.getLeccionesAsignadas());
        }catch(SQLException sqlException){
            sqlException.printStackTrace();
        }
        return procedimiento;
    }//fin de spInsertarDocente

    private CallableStatement spModificarDocente(Connection conexion, Docente docente){
        CallableStatement procedimiento = null;
        try{
            procedimiento = conexion.prepareCall("CALL modificarDocente" + UtilidadesCapaDatos.agregarParametros(15),
                ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            procedimiento.setString(Docente.cedulaNC+"_p", docente.getCedula());
            procedimiento.setString(Docente.nombreNC+"_p", docente.getNombre());
            procedimiento.setString(Docente.apellidosNC+"_p", docente.getApellidos());
            procedimiento.setDate(Docente.fechaNacNC+"_p", docente.getFechaNac());
            procedimiento.setString(Docente.telefono1NC+"_p", docente.getTelefono1());
            procedimiento.setString(Docente.telefono2NC+"_p", docente.getTelefono2());
            procedimiento.setString(Docente.sexoNC+"_p", docente.getSexo());
            procedimiento.setString(Docente.nacionalidadNC+"_p", docente.getNacionalidad());
            procedimiento.setString(Docente.provinciaNC+"_p", docente.getProvincia());
            procedimiento.setString(Docente.cantonNC+"_p", docente.getCanton());
            procedimiento.setString(Docente.distritoNC+"_p", docente.getDistrito());
            procedimiento.setString(Docente.otrasSeniasNC+"_p", docente.getOtrasSenias());
            procedimiento.setString(Docente.puestoNC+"_p", docente.getPuesto());
            procedimiento.setString(Docente.categoriaNC+"_p", docente.getCategoria());
            procedimiento.setInt(Docente.leccionesAsignadasNC+"_p", docente.getLeccionesAsignadas());
        }catch(SQLException sqlException){
            sqlException.printStackTrace();
        }
        return procedimiento;
    }//fin de spModificarDocente
    
    private CallableStatement spEliminarDocente(Connection conexion, String cedula){
        CallableStatement procedimiento = null;
        try{
            procedimiento = conexion.prepareCall("CALL eliminarDocente" + UtilidadesCapaDatos.agregarParametros(1),
                ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            procedimiento.setString(Docente.cedulaNC+"_p", cedula);
        }catch(SQLException sqlException){
            sqlException.printStackTrace();
        }
        return procedimiento;
    }//fin de spEliminarDocente
    
    private Docente crearDocente(ResultSet resultSet) throws SQLException{
        Docente docente = new Docente();
        docente.setCedula(resultSet.getString(Docente.cedulaNC));
        docente.setNombre(resultSet.getString(Docente.nombreNC));
        docente.setApellidos(resultSet.getString(Docente.apellidosNC));
        docente.setFechaNac(resultSet.getDate(Docente.fechaNacNC));
        docente.setTelefono1(resultSet.getString(Docente.telefono1NC));
        docente.setTelefono2(resultSet.getString(Docente.telefono2NC));
        docente.setSexo(resultSet.getString(Docente.sexoNC));
        docente.setNacionalidad(resultSet.getString(Docente.nacionalidadNC));
        docente.setProvincia(resultSet.getString(Docente.provinciaNC));
        docente.setCanton(resultSet.getString(Docente.cantonNC));
        docente.setDistrito((resultSet.getString(Docente.distritoNC)));
        docente.setOtrasSenias(resultSet.getString(Docente.otrasSeniasNC));
        docente.setPuesto(resultSet.getString(Docente.puestoNC));
        docente.setCategoria(resultSet.getString(Docente.categoriaNC));
        docente.setLeccionesAsignadas(resultSet.getInt(Docente.leccionesAsignadasNC));

        return docente;
    }//fin de crearDocente


    private Docente crearDocenteGrid(ResultSet resultSet) throws SQLException{
        Docente docente = new Docente();
        docente.setCedula(resultSet.getString(Docente.cedulaNC));
        docente.setNombre(resultSet.getString(Docente.nombreNC));
        docente.setApellidos(resultSet.getString(Docente.apellidosNC));
        docente.setTelefono1(resultSet.getString(Docente.telefono1NC));
        docente.setPuesto(resultSet.getString(Docente.puestoNC));
        
        return docente;
    }//fin de crearDocente
    
    private Docente crearDocenteComite(ResultSet resultSet) throws SQLException{
        Docente docente = new Docente();
        docente.setCedula(resultSet.getString(Docente.cedulaNC));
        docente.setNombre(resultSet.getString(Docente.nombreNC));
        docente.setApellidos(resultSet.getString(Docente.apellidosNC));
        return docente;
    }//fin de crearDocente

}//fin de la clase ControladoraBDDocente
